package com.agile.leetcode.easy.reformat;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 1417. 重新格式化字符串
 * 给你一个混合了数字和字母的字符串 s，其中的字母均为小写英文字母。
 * <p>
 * 请你将该字符串重新格式化，使得任意两个相邻字符的类型都不同。也就是说，字母后面应该跟着数字，而数字后面应该跟着字母。
 * <p>
 * 请你返回 重新格式化后 的字符串；如果无法按要求重新格式化，则返回一个 空字符串 。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "a0b1c2"
 * 输出："0a1b2c"
 * 解释："0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。
 * 示例 2：
 * <p>
 * 输入：s = "leetcode"
 * 输出：""
 * 解释："leetcode" 中只有字母，所以无法满足重新格式化的条件。
 *
 * @Author:ChenZhangKun
 * @Date: 2021/4/9 14:18
 */
public class Reformat {
    public static void main(String[] args) {
        Reformat reformat = new Reformat();
        String s = reformat.reformat("ab123");
        System.out.println(s);
    }

    public String reformat(String s) {
        if (s.length() == 1) return s;
        // 定义数字和字母的数字
        int charCount = 0;
        List<Character> charList = new ArrayList<>();
        int numCount = 0;
        List<Character> numList = new ArrayList<>();
        // 遍历
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (48 <= c && c <= 57) {
                // 数字
                numCount++;
                numList.add(c);
            } else if (97 <= c && c <= 122) {
                charCount++;
                charList.add(c);
            }
        }
        if (charCount == 0 || numCount == 0) {
            return "";
        }
        // 打乱顺序
        Collections.shuffle(charList);
        Collections.shuffle(numList);
        StringBuilder builder = new StringBuilder();
        if (charCount >= numCount) {
            for (int i = 0; i < charCount; i++) {
                builder.append(charList.get(i));
                if (i < numCount) {
                    builder.append(numList.get(i));
                }
            }
            return builder.toString();
        } else {
            for (int i = 0; i < numCount; i++) {
                builder.append(numList.get(i));
                if (i < charCount) {
                    builder.append(charList.get(i));
                }
            }
            return builder.toString();
        }
    }
}
